package com.wesley.growth;

import com.aspose.words.License;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.bytecode.AttributeInfo;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;

import java.io.ByteArrayInputStream;

/**
 * AsposeCracker
 *
 * @author WangPanYong
 * @since 2023/06/21 15:42
 */
public class AsposeWordCracker {

    public static void main(String[] args) throws Exception {
        modifyJar22_12();
    }

    /**
     * 修改 Words.jar包里面的校验
     *
     * 破解版本号: aspose-words-22.12-jdk17.jar
     */
    public static void modifyJar22_12() {
        try {
            //这一步是完整的jar包路径,选择自己解压的jar目录
            String path = "F:\\Projects\\demo-space\\jdk11-samples\\aspose-words-22.12-jdk17.jar";
            ClassPool.getDefault().insertClassPath(path);
            //获取指定的class文件对象
            CtClass zzZJJClass = ClassPool.getDefault().getCtClass("com.aspose.words.zzYvW");
            //从class对象中解析获取所有方法
            CtMethod[] declaredMethods = zzZJJClass.getDeclaredMethods();
            for (CtMethod ctMethod : declaredMethods) {
                //获取方法获取参数类型
                CtClass[] ps = ctMethod.getParameterTypes();
                //筛选同名方法
                if (ctMethod.getName().equals("zzzD")
                        && ps.length == 2 && ps[0].getName().equals("org.w3c.dom.Node")
                        && ps[1].getName().equals("org.w3c.dom.Node")) {
                    MethodInfo methodInfo = ctMethod.getMethodInfo();
                    String body = "{zzab(null, null, (String)null);" +
                            "return true;}";
                    //替换指定方法的方法体
                    ctMethod.setBody(body);
                }
            }
            //这一步就是将破译完的代码输出
            zzZJJClass.writeFile("F:\\temp");

            CtClass class2 = ClassPool.getDefault().getCtClass("com.aspose.words.zzZ6D");
            CtMethod[] class2Methods = class2.getDeclaredMethods();
            for (CtMethod ctMethod : class2Methods) {
                String ctMethodName = ctMethod.getName();
                //获取方法获取参数类型
                CtClass[] ps = ctMethod.getParameterTypes();
                //筛选同名方法
                if (ctMethodName.equals("zzoe")
                        && ps.length == 1) {
                    String body = "{zzZ64.set(Integer.valueOf(0));}";
                    //替换指定方法的方法体
                    ctMethod.setBody(body);
                }
            }
            class2.writeFile("F:\\temp");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
